LVS 负载均衡 fullnat 模式和 nat 模式的区别

        关于LVS和FULLNAT的介绍可以看一下 淘宝吴佳明(普空)的视频 ,FULLNAT 模式很大简化了LVS的配置和部署,目前淘宝和百度基本上都在使用FULLNAT模式来作为接入侧的负载均衡模式.

        百度的LVS叫做BVS, Baidu Virtual Server, 是在LVS基础上修改的增加了L3 Though 和 SYN Porxy,貌似也是吴佳明(普空)在百度搞的, 类似FULLNAT 项目.

        下面的图来自吴佳明(普空)的PPT, 自己重画了一遍,关于NAT和FULLNAT的区别如下图所示:

        看完上图后发现 FULLNAT有一个问题是:RealServer无法获得用户IP;淘宝通过叫TOA的方式解决的,

        主要原理是:将 client address 放到了TCP Option 里面带给后端RealServer,RealServer 收到后保存在 socket 的结构体里并通过toa内核模块 hook 了 getname 函数,这样当用户调用 getname 获取远端地址时,返回的是保存在 socket 的 TCPOption 的 IP . 百度的 BVS 是通过叫 ttm 模块实现的,其实现方式跟 toa 基本一样,只是没有开源.

        实现原理图如下:

        下面看下上面说的逻辑的实现代码

        lvs侧在TCP报文的选项中插入clientip代码: tcp_fnat_in_handler()

        RS 侧收到建连报文时,取出 toa 里面的 client ip 和 port 存放在 socket 的 use_data 里, toa.c

        HOOK挂载:

        当应用层调用 getpeername() 或者 getsocketname() 时,会进入到 inet_getname_toa,如果存在toa 信息则将 socket 存放的真是的 clientip 返回给应用层。